#include<iostream>
using namespace std;
#include<cstring>

/*1.static 静态
1.1 静态数据成员
   (1)将 static 放在变量前，表示所有的对象共享同一个内存空间；
   (2)需要在类外进行初始化，用：：指明所属的类；
   (3)如何被访问：用类名或者对象名进行访问。
1.2静态成员函数
   (1)如何被访问：用类名或者对象名进行访问；
   (2)静态成员函数只能访问静态成员（包括变量/函数）。
*/
/*2.const 常
2.1 常数据成员
   (1)值不能修改；
   (2)2种初始化方法。
2.2 常成员函数
   (1)const要写到函数参数的括号后面，大括号的前面；
   (2)函数体内只能使用数据成员的值，但不能修改数据成员的内容;
   (3)只能调用常函数
*/
/*3.this指针
3.1 指向当前对象的指针；
3.2 使用：
   (1)形参名与类的成员名相同时，要使用this指针；
   (2)函数返回当前对象时，可以借助this指针。
*/
/*对象数组与指向对象的指针
*/

/*class stu
{
	char name[20];
	int age;
	static int banji; //banji 为静态数据成员
	const double PI = 3.14; //常数据成员 [初始化方法1]
public:
	stu(char* n, int a):PI(3.14) //常数据成员 [初始化方法2]
	{
		strcpy(name, n);
		age = a;
	}
	void show1()
	{
		cout<<stu::banji;
		cout<<banji;
	}
	
	static void fun1() //静态成员函数
	{
		//cout<<age<<"  "<<name;  
		//不能访问非静态成员
		cout<<banji;
	}
	
	void fun2()const
	{
		//age = 23; 常函数可以使用数据成员，但不能改数据成员的内容。
		cout<<age;
		//show();
	}
};

int stu::banji = 101; //初始化，并且指明所属类

int main()
{
	stu s1("zhangsan", 25), s2("lisi", 18);
	s1.show1();
	return 0;
}*/

/*class stu
{
	char name[20];
	int age;
public:
	stu(char* n = "moumou", int a = 0)
	{
		strcpy(name, n);
		age = a;
	}
	//与上方构造函数等价
	//当形参名与类的成员名相同时，要使用this指针
	//stu(char* name, int age) --->此处隐含了参数 stu *this
	//{
	//	strcpy(this->name, name);
	//	(*this).age = age;
	//}
	
	void show1()
	{
		cout<<name<<"  "<<age<<endl;
	}
	//show2等价于show1
	//void show2(stu* this)
	//{
	//	cout<<(*this).age;
	//}
	
	stu operator=(const stu &s)
	{
		strcpy(name, s.name);
		age = s.age;
		return *this; //以"s1 = s2"为例，this--->&s1
	}
};

int main()
{
	stu s1("zhangsan", 25), s2("lisi", 18), s3("wangwu", 32);
	s1.show1();//--->本质上为 show1(&s1);
    s2.show1();//--->本质上为 show1(&s2);
	
	s1 = s2 = s3;
	s1.show1();
	s2.show1();
	
	//对象数组
	stu s[20]; // s[0]-s[19] 共调用20次无参构造
	stu s0[3] = {stu("A", 12), stu("B", 18), stu("C", 32)}; //无名对象
	int i = 0;
	for(i = 0; i < 3; i++)
		s0[i].show1();

	//指向对象的指针
	stu *p;
	p = &s1;
	//s1.show1() <---> (*p).show1() <---> p->show1()
	
	return 0;
}*/
